﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using BasicForms;
using Lists;
using GeneralLibs;
using DevExpress.XtraGrid;
using CustomSecurity;
using System.Linq;

namespace KiemKe
{
    public partial class FrmThongKeHangDaKiemKe_SoSanh : BasicForms.FrmSupportPrintableComponents
    {
        public FrmThongKeHangDaKiemKe_SoSanh()
        {
            InitializeComponent();
        }

        private void FrmThongKeHangDaKiemKe_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;
            try
            {
                cmbKyBaoCao.SelectedText = "Tùy chọn";

                cmbKho.DataSource = DanhMucKho.Instance.DataView;
                cmbKho.DisplayColumn = "Ten";
                cmbKho.ValueColumn = "ID";
                cmbKho.AddVisibleColumn("Ma", "Mã");
                cmbKho.AddVisibleColumn("Ten", "Tên");

                cmbThoiDiemKhoaSo.DataSource = DanhMucThoiDiemKhoaSo.GetCacThoiDiemChotSoDu().DataView;
                cmbThoiDiemKhoaSo.DisplayColumn = "ThoiDiem";
                cmbThoiDiemKhoaSo.ValueColumn = "ID";
                cmbThoiDiemKhoaSo.AddVisibleColumn("ThoiDiem", "Thời điểm");
                cmbThoiDiemKhoaSo.AddVisibleColumn("DienGiai", "Diễn giải");

                cmbThoiDiemKhoaSoTinhGiaVon.DataSource = DanhMucThoiDiemKhoaSo.GetCacThoiDiemChotSoDu().DataView;
                cmbThoiDiemKhoaSoTinhGiaVon.DisplayColumn = "ThoiDiem";
                cmbThoiDiemKhoaSoTinhGiaVon.ValueColumn = "ID";
                cmbThoiDiemKhoaSoTinhGiaVon.AddVisibleColumn("ThoiDiem", "Thời điểm");
                cmbThoiDiemKhoaSoTinhGiaVon.AddVisibleColumn("DienGiai", "Diễn giải");

                nmrPhanTram.Text = "0";

                rdoGiaVonConTrongKho.Checked = false;
                rdoGiaVonMuaVao.Checked = true;

                colTontheoMay.Visible = false;
                colSoLuongMat.Visible = false;
                colGiaVonTheoMay.Visible = false;

                dtNgayTonKho.EditValue = null;
            }
            catch (Exception ex)
            {
            }

            foreach (DevExpress.XtraGrid.Columns.GridColumn column in gridView.Columns)
            {
                column.OptionsFilter.AutoFilterCondition = DevExpress.XtraGrid.Columns.AutoFilterCondition.Contains;
            }
        }

        private void cmbKyBaoCao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                FrmThamSoBaoCao.ThietLapKhoangThoiGianBaoCao(cmbKyBaoCao.Text, cmbKyBaoCao, dtNgayBatDau, dtNgayKetThuc);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbKho_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete) cmbKho.EditValue = Guid.Empty;
        }

        private DataTable GetHangDaCoGiaoDichNhungKhongCoTrongKiemKe(SqlCommand cmd, Guid selectedKhoID, DateTime thoiDiemDauKiemKe, DateTime thoiDiemCuoiKiemKe, DateTime ngayTinhTonKho)
        {
            try
            {
                ThoiDiemKhoaSo thoiDiemKhoaSo = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(ngayTinhTonKho);
                if (selectedKhoID != null && selectedKhoID != Guid.Empty)
                {
                    cmd.CommandText = string.Format("SELECT VatTuHangHoaID, KhoID FROM (\n" +
                                                    "   SELECT DISTINCT VatTuHangHoaID, KhoID \n" +
                                                    "   FROM NhatKyKho \n" +
                                                    "   WHERE  KhoID = @KhoID AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi \n" +
                                                    "      AND VatTuHangHoaID is not null \n" +
                                                    "   UNION \n" +
                                                    "   SELECT DISTINCT VatTuHangHoaID, KhoID \n" +
                                                    "   FROM TonKho \n " +
                                                    "   WHERE KhoID = @KhoID AND SoLuong <> 0 \n" +
                                                    "      AND VatTuHangHoaID is NOT NULL ) AS TBL \n" +
                                                    "WHERE VatTuHangHoaID NOT IN ( \n" +
                                                    "   SELECT B.VatTuHangHoa1ID VatTuHangHoaID \n" +
                                                    "   FROM ChungTu A INNER JOIN LoaiChungTu LCT ON A.LoaiChungTuID = LCT.ID AND LCT.Ma = N'PhieuKiemKe' \n" +
                                                    "	    INNER JOIN KhoanMucChungTu B ON A.ChungTuID = B.ChungTuID \n" +
                                                    "   WHERE A.Kho1ID = @KhoID AND @ThoiDiemDauKiemKe <= Ngay AND Ngay <= @ThoiDiemCuoiKiemKe \n" +
                                                    ")  ",
                                                    selectedKhoID);
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("KhoID", selectedKhoID);
                    cmd.Parameters.AddWithValue("ThoiDiemDau", thoiDiemKhoaSo.ThoiDiem);
                    cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayTinhTonKho);
                    cmd.Parameters.AddWithValue("ThoiDiemDauKiemKe", thoiDiemDauKiemKe);
                    cmd.Parameters.AddWithValue("ThoiDiemCuoiKiemKe", thoiDiemCuoiKiemKe);
                }
                else
                {
                    cmd.CommandText = string.Format("SELECT VatTuHangHoaID FROM (\n" +
                                                    "   SELECT DISTINCT VatTuHangHoaID \n" +
                                                    "   FROM NhatKyKho \n" +
                                                    "   WHERE  @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi  \n" +
                                                    "   	AND VatTuHangHoaID is NOT NULL \n" +
                                                    "   UNION \n" +
                                                    "   SELECT DISTINCT VatTuHangHoaID  \n" +
                                                    "   FROM TonKho  \n" +
                                                    "   WHERE SoLuong <> 0 \n" +
                                                    "       AND VatTuHangHoaID is NOT NULL ) AS TBL \n" +
                                                     "WHERE VatTuHangHoaID NOT IN ( \n" +
                                                    "   SELECT B.VatTuHangHoa1ID VatTuHangHoaID \n" +
                                                    "   FROM ChungTu A INNER JOIN LoaiChungTu LCT ON A.LoaiChungTuID = LCT.ID AND LCT.Ma = N'PhieuKiemKe' \n" +
                                                    "	    INNER JOIN KhoanMucChungTu B ON A.ChungTuID = B.ChungTuID \n" +
                                                    "   WHERE @ThoiDiemDauKiemKe <= Ngay AND Ngay <= @ThoiDiemCuoiKiemKe \n" +
                                                    ")  ");

                    cmd.Parameters.Clear();
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("ThoiDiemDau", thoiDiemKhoaSo.ThoiDiem);
                    cmd.Parameters.AddWithValue("ThoiDiemCuoi", ngayTinhTonKho);
                    cmd.Parameters.AddWithValue("ThoiDiemDauKiemKe", thoiDiemDauKiemKe);
                    cmd.Parameters.AddWithValue("ThoiDiemCuoiKiemKe", thoiDiemCuoiKiemKe);
                }
                DataTable dtDaCoGiaoDich = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dtDaCoGiaoDich);
                return dtDaCoGiaoDich;
            }
            catch (Exception ex)
            {
                string message = string.Format("Lỗi [{0}] ở \n {1}", ex.Message, ex.StackTrace.Substring(0, ex.StackTrace.IndexOf("\n")));
                throw new CustomException(message);
                return null;
            }
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            if (cmbThoiDiemKhoaSoTinhGiaVon.EditValue == null || !(cmbThoiDiemKhoaSoTinhGiaVon.EditValue is Guid)
                || (Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue == Guid.Empty)
            {
                FrmWarning.Show("Thông báo", "Cần chọn thời điểm tại Điều kiện khác để xác định thời gian tính giá vốn");
                cmbThoiDiemKhoaSoTinhGiaVon.Focus();
                return;
            }

            if (chkTinhTonTheoMay.Checked && (dtNgayTonKho.EditValue == null || dtNgayTonKho.Text == ""))
            {
                FrmWarning.Show("Thông báo", "Cần chọn ngày tính tồn kho");
                dtNgayTonKho.Focus();
                return;
            }

            Guid khoID = Guid.Empty;
            DateTime ngayBatDauKiemKe = dtNgayBatDau.DateTime;
            DateTime ngayKetThucKiemKe = dtNgayKetThuc.DateTime;
            DateTime ngayTonKho = dtNgayTonKho.DateTime;

            if (cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty) khoID = (Guid)cmbKho.EditValue;

            string kyBaoCao = cmbKyBaoCao.Text;
            if (kyBaoCao == "Cả năm") kyBaoCao = "Năm " + GeneralLibs.Config.NamTaiChinh.ToString();
            else if (kyBaoCao == "Tùy chọn") kyBaoCao = string.Format("Từ ngày {0}/{1}/{2} đến ngày {3}/{4}/{5}",
                                       ngayBatDauKiemKe.Day, ngayBatDauKiemKe.Month, ngayBatDauKiemKe.Year,
                                       ngayKetThucKiemKe.Day, ngayKetThucKiemKe.Month, ngayKetThucKiemKe.Year);

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                SqlCommand cmd = con.CreateCommand();
                con.Open();

                if (khoID != Guid.Empty && cmbKho.Text != "")
                {
                    cmd.CommandText = string.Format("SELECT  D.ID VatTuHangHoaID, D.Ma MaHang, D.Ten TenHang, E.Ten TenNhom, D.GiaBia, C.Value12 GiaBiaKhiKiemKe, C.Value12 * SUM(C.Value1) ThanhTienGiaBiaKhiKiemKe, \n" +
                                                   "   C.Value8 ChietKhauMua, D.DonViTinh,D.TacGia,D.NhaXuatBan, SUM(C.Value1) SoLuongTon, \n" +
                                                   "CASE WHEN SUM(C.Value1) >0 THEN SUM(C.Value3)/SUM(C.Value1)ELSE CAST(0 AS money) END DonGiaVon , SUM(C.Value3) ThanhTienVon \n " +
                                                   "FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID  \n " +
                                                   "    INNER JOIN  KhoanMucChungTu C ON A.ChungTuID = C.ChungTuID  \n " +
                                                   "    LEFT JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID  \n " +
                                                   "    LEFT JOIN NhomVatTuHangHoa E ON D.NhomVatTuHangHoaID = E.ID \n " +
                                                   "WHERE LCT.Ma = N'PhieuKiemKe'  \n " +
                                                   "AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi  \n" +
                                                   "AND A.Kho1ID = '{0}'  \n" +
                                                   "GROUP BY  D.ID, D.Ma, D.Ten, E.Ten, D.GiaBia, D.ChietKhauMua, D.DonViTinh, D.TacGia, D.NhaXuatBan, C.Value8, C.Value12 \n" +
                                                   "ORDER BY D.Ten ",
                                                   khoID);
                }
                else
                {
                    cmd.CommandText = string.Format("SELECT  D.ID VatTuHangHoaID, D.Ma MaHang, D.Ten TenHang, E.Ten TenNhom, D.GiaBia, C.Value12 GiaBiaKhiKiemKe, C.Value12 * SUM(C.Value1) ThanhTienGiaBiaKhiKiemKe, \n" +
                                                  "   C.Value8 ChietKhauMua, D.DonViTinh,D.TacGia,D.NhaXuatBan, SUM(C.Value1) SoLuongTon, \n" +
                                                  "CASE WHEN SUM(C.Value1) >0 THEN SUM(C.Value3)/SUM(C.Value1)ELSE CAST(0 AS money) END DonGiaVon , SUM(C.Value3) ThanhTienVon \n " +
                                                  "FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID  \n " +
                                                  "    INNER JOIN  KhoanMucChungTu C ON A.ChungTuID = C.ChungTuID  \n " +
                                                  "    LEFT JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID  \n " +
                                                  "    LEFT JOIN NhomVatTuHangHoa E ON D.NhomVatTuHangHoaID = E.ID \n " +
                                                  "WHERE LCT.Ma = N'PhieuKiemKe'  \n " +
                                                  "AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi  \n" +
                                                  "GROUP BY  D.ID, D.Ma, D.Ten, E.Ten, D.GiaBia, D.ChietKhauMua, D.DonViTinh, D.TacGia, D.NhaXuatBan, C.Value8, C.Value12 \n" +
                                                  "ORDER BY D.Ten ");
                }

                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@ThoiDiemDau", ngayBatDauKiemKe);
                cmd.Parameters.AddWithValue("@ThoiDiemCuoi", ngayKetThucKiemKe);

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                dsThongKeHangKiemKe.HangKiemKe.Clear();
                da.Fill(dsThongKeHangKiemKe.HangKiemKe);

                //Lọc những hàng trùng nhau trong danh sách đã sắp xếp. Tính chiết khấu trung bình.
                DataRow beforeRow = null;
                DataRow currRow = null;
                int i = 1;
                while (dsThongKeHangKiemKe.HangKiemKe.Rows.Count > i)
                {
                    beforeRow = dsThongKeHangKiemKe.HangKiemKe.Rows[i - 1];
                    currRow = dsThongKeHangKiemKe.HangKiemKe.Rows[i];
                    if (beforeRow["VatTuHangHoaID"] is Guid && currRow["VatTuHangHoaID"] is Guid && (Guid)beforeRow["VatTuHangHoaID"] == (Guid)currRow["VatTuHangHoaID"])
                    {
                        currRow["ChietKhauMua"] = Math.Round(((decimal)beforeRow["ChietKhauMua"] * (decimal)beforeRow["SoLuongTon"] + (decimal)currRow["ChietKhauMua"] * (decimal)currRow["SoLuongTon"]) / ((decimal)beforeRow["SoLuongTon"] + (decimal)currRow["SoLuongTon"]), 1);
                        currRow["SoLuongTon"] = (decimal)beforeRow["SoLuongTon"] + (decimal)currRow["SoLuongTon"];
                        currRow["DonGiaVon"] = Math.Round((decimal)currRow["GiaBia"] * ((100 - (decimal)currRow["ChietKhauMua"]) / 100));
                        //currRow["ThanhTienVon"] = (decimal)currRow["SoLuongTon"] * (decimal)currRow["DonGiaVon"];
                        beforeRow.Delete();
                    }
                    i++;
                }

                BasicForms.FrmProgressBar.StartShowProgress();
                dsThongKeHangKiemKe.HangKiemKe.AcceptChanges();

                //Tinh ton toan bo theo may.
                //Và trộn cả nhũng hàng đã có giao dịch để so sánh cho dễ, k cần qua excel nữa
                if (chkTinhTonTheoMay.Checked)
                {
                    //B1: lấy ra những hàng đã giao dịch, nhưng k có trong kiểm kê
                    DataTable dtHangThieu = GetHangDaCoGiaoDichNhungKhongCoTrongKiemKe(cmd, khoID, ngayBatDauKiemKe, ngayKetThucKiemKe, ngayTonKho);

                    //B2: Add VatTuHangHoaID không có trong kiểm kê vào bảng kiểm kê
                    foreach (DataRow rowThieu in dtHangThieu.Rows)
                    {
                        if (rowThieu["VatTuHangHoaID"] is Guid)
                        {
                            VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID((Guid)rowThieu["VatTuHangHoaID"]);
                            if (vthh != null)
                            {
                                DataRow rowAdd = dsThongKeHangKiemKe.HangKiemKe.NewRow();
                                rowAdd["VatTuHangHoaID"] = vthh.ID;
                                rowAdd["MaHang"] = vthh.Ma;
                                rowAdd["TenHang"] = vthh.Ten;
                                try
                                {
                                    rowAdd["TenNhom"] = vthh.TenNhomHangHoa;
                                }
                                catch (Exception ex)
                                { }
                                rowAdd["GiaBia"] = vthh.GiaBia;
                                rowAdd["DonViTinh"] = vthh.DonViTinh;
                                rowAdd["NhaXuatBan"] = "Hàng có tồn nhưng k có trong kiểm kê";
                                dsThongKeHangKiemKe.HangKiemKe.Rows.Add(rowAdd);
                            }
                        }
                    }

                    int total = dsThongKeHangKiemKe.HangKiemKe.Rows.Count;
                    int count = 0;

                    //B3: Tính toán tồn rồi nhét hết vào grid
                    ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoGanNhat(ngayTonKho);
                    ThoiDiemKhoaSo thoiDiemKhoaSoTinhGiaVon = thoiDiemKhoaSoGanNhat;
                    if (cmbThoiDiemKhoaSoTinhGiaVon.EditValue != null && cmbThoiDiemKhoaSoTinhGiaVon.EditValue is Guid
                        && (Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue != Guid.Empty)
                        thoiDiemKhoaSoTinhGiaVon = DanhMucThoiDiemKhoaSo.Instance.GetByID((Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue);
                    foreach (DataRow row in dsThongKeHangKiemKe.HangKiemKe.Rows)
                    {
                        if (row.RowState != DataRowState.Deleted)
                        {
                            try
                            {
                                VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByProperty("Ma", row["MaHang"]);
                                TonKho tonTheoKho = null;
                                TonKho tonToanBo = TonKho.CalculateTongTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVao(cmd, ngayTonKho, vthh.ID);
                                if (DanhMucKho.Instance.Count <= 1)
                                {
                                    //nếu có 1 kho thì bằng luôn toàn bộ, tính nhiều nặng máy
                                    tonTheoKho = tonToanBo;
                                }
                                else
                                {
                                    //Nếu nhiều kho thì tính đích danh kho nào
                                    tonTheoKho = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, ngayTonKho, khoID, vthh.ID);
                                }

                                if (tonTheoKho.SoLuong is decimal) row["TonTheoKho"] = tonTheoKho.SoLuong;
                                if (tonToanBo.SoLuong is decimal) row["TonTheoMay"] = tonToanBo.SoLuong;

                                //Giá vốn theo máy
                                decimal donGiaVonTheoMay = 0;
                                if (rdoGiaVonConTrongKho.Checked)
                                    donGiaVonTheoMay = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonTrungBinhTheoGiaTriConLaiToanBoTheoKhoByID(
                                                                                        vthh.ID, khoID, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, ngayTonKho);
                                else if (rdoGiaVonMuaVao.Checked)
                                    donGiaVonTheoMay = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoTheoKhoByID(
                                                                                        vthh.ID, khoID, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, ngayTonKho);
                                row["GiaVonTheoMay"] = donGiaVonTheoMay;
                                decimal tonThucTe = CommonLib.ConvertToDecimal(row["SoLuongTon"]);
                                row["ThanhTienVon"] = tonThucTe * donGiaVonTheoMay;
                                row["SoLuongMat"] = tonThucTe - tonTheoKho.SoLuong;

                                count++;
                                BasicForms.FrmProgressBar.Status = "Đã xử lý " + count + "/ " + total + " dòng";
                            }
                            catch (Exception ex)
                            {
                            }
                        }
                    }

                    colTonTheoKho.Visible = true;
                    colTontheoMay.Visible = true;
                    colSoLuongMat.Visible = true;
                    colGiaVonTheoMay.Visible = true;
                }
                else
                {
                    colTonTheoKho.Visible = false;
                    colTontheoMay.Visible = false;
                    colSoLuongMat.Visible = false;
                    colGiaVonTheoMay.Visible = false;
                }

                //Lọc lấy những hàng có tồn thực tế <> 0 hoặc tồn kho <> 0.
                //Trường hợp tồn thực tế = tồn kho = 0 thì k cần hiện làm gì
                try
                {
                    dsThongKeHangKiemKe.HangKiemKe.DefaultView.RowFilter = "SoLuongTon != 0 || TonTheoKho != 0";

                    gridControl.DataSource = dsThongKeHangKiemKe.HangKiemKe.DefaultView.ToTable();
                }
                catch (Exception ex)
                {
                    //Nếu lỗi thì gán lại cái full cho khỏi phải tính lại
                    gridControl.DataSource = dsThongKeHangKiemKe.HangKiemKe;
                }

            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                con = null;
            }
            BasicForms.FrmProgressBar.FinishShowProgress();

            FormatNumberInGridView(gridView);
        }

        private void btnPreview_Click(object sender, EventArgs e)
        {
            string ngayThongKe = string.Format("Ngày : {0}", System.DateTime.Now);
            PrintWithHeaderAndFooter(true, gridControl, true, true, "THỐNG KÊ HÀNG HÓA ĐÃ KIỂM KÊ", "", ngayThongKe, "", "");
        }

        private void cmbUpdate_Click(object sender, EventArgs e)
        {
            if (cmbThoiDiemKhoaSo.EditValue == null || (Guid)cmbThoiDiemKhoaSo.EditValue == Guid.Empty)
            {
                MessageBox.Show("Chưa chọn thời điểm khóa sổ");
                return;
            }
            ThoiDiemKhoaSo thoiDiemKhoaSo = DanhMucThoiDiemKhoaSo.Instance.GetByID((Guid)cmbThoiDiemKhoaSo.EditValue);

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                SqlCommand cmd = con.CreateCommand();
                con.Open();
                FrmProgressBar.StartShowProgress();
                int count = 1, total = dsThongKeHangKiemKe.HangKiemKe.Rows.Count;
                foreach (DataRow row in dsThongKeHangKiemKe.HangKiemKe.Rows)
                {
                    if (row.RowState != DataRowState.Deleted && row["VatTuHangHoaID"] is Guid && (Guid)row["VatTuHangHoaID"] != Guid.Empty)
                    {
                        TonKho tonKho = new TonKho();
                        tonKho.ThoiDiemKhoaSoID = (Guid)cmbThoiDiemKhoaSo.EditValue;
                        tonKho.KhoID = (Guid)cmbKho.EditValue;
                        tonKho.VatTuHangHoaID = (System.Guid)row["VatTuHangHoaID"];
                        tonKho.SoLuong = (decimal)row["SoLuongTon"];
                        tonKho.DonGia = (decimal)row["DonGiaVon"];
                        tonKho.ThanhTien = (decimal)row["ThanhTienVon"];

                        tonKho.InsertOrUpdate2DB(cmd);
                    }
                    FrmProgressBar.Status = string.Format("Đã xử lý được {0}/{1}", count++, total);
                }

                //Tính xong giá trị hàng hóa vào 1561
                decimal tongGiaTri = TonKho.SumTongGiaTriTonKhoFromDB(thoiDiemKhoaSo.ID);

                SoDuTaiKhoan soDuTaiKhoan = new SoDuTaiKhoan();
                TaiKhoan tk1561 = DanhMucTaiKhoan.Instance.GetBySoHieu("1561");
                soDuTaiKhoan.TaiKhoanID = tk1561.ID; //Số hiệu(mặc định phần mềm):1561
                soDuTaiKhoan.ThoiDiemKhoaSoID = thoiDiemKhoaSo.ID;

                soDuTaiKhoan.DuNo = tongGiaTri;
                soDuTaiKhoan.InsertOrUpdate2DB(cmd);

                TaiKhoan taiKhoanCon = DanhMucTaiKhoan.Instance.GetByID(tk1561.ID);
                while (taiKhoanCon.TaiKhoanCha != null)
                {
                    SoDuTaiKhoan soDuTaiKhoanCha = new SoDuTaiKhoan();
                    soDuTaiKhoanCha.TaiKhoanID = taiKhoanCon.TaiKhoanCha.ID;
                    soDuTaiKhoanCha.ThoiDiemKhoaSoID = thoiDiemKhoaSo.ID;
                    soDuTaiKhoanCha.TongHopTuTieuKhoan(cmd);
                    soDuTaiKhoanCha.InsertOrUpdate2DB(cmd);

                    taiKhoanCon = taiKhoanCon.TaiKhoanCha;
                }

                gridControl.DataSource = dsThongKeHangKiemKe.HangKiemKe;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                con = null;
            }
            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void TinhToanGiaVon()
        {
            ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(dtNgayKetThuc.DateTime);
            ThoiDiemKhoaSo thoiDiemKhoaSoTinhGiaVon = thoiDiemKhoaSoGanNhat;
            if (cmbThoiDiemKhoaSoTinhGiaVon.EditValue != null && cmbThoiDiemKhoaSoTinhGiaVon.EditValue is Guid
                && (Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue != Guid.Empty)
                thoiDiemKhoaSoTinhGiaVon = DanhMucThoiDiemKhoaSo.Instance.GetByID((Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue);

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                SqlCommand cmd = con.CreateCommand();
                con.Open();
                FrmProgressBar.StartShowProgress();
                int count = 1, total = dsThongKeHangKiemKe.HangKiemKe.Rows.Count;
                foreach (DataRow row in dsThongKeHangKiemKe.HangKiemKe.Rows)
                {
                    if (row.RowState != DataRowState.Deleted)
                    {
                        if (row["VatTuHangHoaID"] is Guid && (Guid)row["VatTuHangHoaID"] != Guid.Empty) //Đảm bảo là hàng có giá trị
                        {
                            if (cmbKho.EditValue != null && cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty) //Tính giá vốn theo kho
                            {
                                decimal donGiaVon = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonTrungBinhTheoGiaTriConLaiToanBoTheoKhoByID(
                                    (Guid)row["VatTuHangHoaID"], (Guid)cmbKho.EditValue, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, dtNgayKetThuc.DateTime);
                                row["DonGiaVon"] = donGiaVon;
                                row["ThanhTienVon"] = donGiaVon * (decimal)row["SoLuongTon"];
                            }
                            else //Tính toán bộ các kho
                            {
                                decimal donGiaVon = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoByID(
                                        (Guid)row["VatTuHangHoaID"], thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, dtNgayKetThuc.DateTime);
                                row["DonGiaVon"] = donGiaVon;
                                row["ThanhTienVon"] = donGiaVon * (decimal)row["SoLuongTon"];
                            }
                        }
                    }
                    FrmProgressBar.Status = string.Format("Đã xử lý được {0}/{1}", count++, total);
                }

                gridControl.DataSource = dsThongKeHangKiemKe.HangKiemKe;
                cmbThoiDiemKhoaSoTinhGiaVon.Visible = false;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                con = null;
            }
            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void cmbThoiDiemKhoaSoTinhGiaVon_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void nmrPhanTram_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnUpdateHangKDung_Click(object sender, EventArgs e)
        {
            if (gridControl.DataSource != null &&
                MessageBox.Show("Bạn có chắc chắn muốn chuyển những hàng không có trong danh sách kiểm kê sang không dùng?", "Xác nhận",
                MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
                try
                {
                    con.Open();
                    SqlCommand cmd = con.CreateCommand();
                    cmd.CommandText = string.Format("UPDATE VatTuHangHoa SET TrangThai = 0\n" +
                                                    "WHERE ID NOT IN( \n" +
                                                    "	SELECT DISTINCT B.VatTuHangHoa1ID  \n" +
                                                    "	FROM ChungTu A INNER JOIN KhoanMucChungTu B ON A.ChungTuID = B.ChungTuID \n" +
                                                    "		INNER JOIN LoaiChungTu C ON A.LoaiChungTuID = C.ID AND C.Ma = 'PhieuKiemKe' \n" +
                                                    "	WHERE @NgayBatDau <= A.Ngay AND A.Ngay <= @NgayKetThuc  \n" +
                                                    ") \n");
                    cmd.Parameters.Clear();
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@NgayBatDau", dtNgayBatDau.DateTime);
                    cmd.Parameters.AddWithValue("@NgayKetThuc", dtNgayKetThuc.DateTime);
                    FrmProgressBar.StartShowProgress("Đang cập nhật danh mục hàng hóa");
                    cmd.ExecuteNonQuery();
                    FrmProgressBar.FinishShowProgress();
                    FrmWarning.Show("Thông báo", "Đã cập nhật xong");
                }
                catch (Exception ex)
                {
                    BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                }
                finally
                {
                    con.Close();
                    FrmProgressBar.FinishShowProgress();
                }
            }
        }
    }
}
